package org.example.union;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author zhaokuii11@163.com
 * @create 2021-12-06 18:37
 * @Description
 */
public class Test1 {
    private SessionFactory sessionFactory;//会话工厂
    private Session session;//会话
    private Transaction transaction;//事务

    @Before //juint测试方法 之前执行
    public void init() {
        System.out.println("init");
        //1. 根据 Configuration创建 会话工厂
        sessionFactory = new Configuration().configure().buildSessionFactory();
        //2. 创建 会话
        session = sessionFactory.openSession();
        //3. 创建事务
        transaction = session.beginTransaction();
    }


    @Test
    public void testUpdate() {
        String hql = "update org.example.union.Person p set p.age=25";
        session.createQuery(hql).executeUpdate();
    }

    /**
     * 查询
     * 1. 查询父类记录，需把父表和子表汇总到一起在做查询，性能稍差
     * 2. 对于子类，也只需要查询一张数据表
     * 优点
     * 1. 不需要使用辨别者列。
     * 2. 子类独有的字段能添加非空约束
     * 缺点：
     * 1. 存在冗余的代码
     * 2. 若更新父表的字段较低
     */
    @Test
    public void testQuery() {
        List<org.example.union.Person> people = session.createQuery("from org.example.union.Person").list();
        System.out.println(people.size());//
        List<org.example.union.Student> students = session.createQuery("from org.example.union.Student").list();
        System.out.println(students.size());//
    }

        /**
         * 插入操作
         * 1. 对于子类对象至少需要插入两张数据表
         */
        @Test
        public void testSave() {
            Person person = new Person(2, "吉良吉影", 21);
            session.save(person);
            Student student = new Student(3, "DIO", 21, "阳光小学");
            session.save(student);
        }

    @After//juint测试方法 之后执行
    public void destroy() {
        //先开后关
        System.out.println("destroy");
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
}
